#!/bin/bash

# 使用find查找当前路径和子路径下的所有elf文件，并排除.ko后缀的文件
# elf_files=$(find . -type f ! -name '*.ko' -exec file {} \; | grep 'ELF' | cut -d: -f1)

# Use fd, faster than find.
elf_files=$(fd -t f --exclude '*.ko' -x file {} \; | grep 'ELF' | cut -d: -f1)

# 初始化符号编号
symbol_index=1

# 创建一个临时文件用于保存所有符号
temp_symbols="temp_symbols.txt"
> $temp_symbols

# 创建一个空的映射文件
map_file="symbol_map.txt"
> $map_file

# 遍历所有的elf文件来提取符号
for elf in $elf_files; do
    readelf -sW $elf | grep -E 'FUNC|OBJECT' | awk '$7 !~/ABS/{print $8}' | grep -v '@' | grep -vE '^_Z' >> $temp_symbols
done

# 按字符串长度对符号进行排序并去重
sorted_symbols=$(cat $temp_symbols | sort | uniq | awk '{ print length, $0 }' | sort -n | cut -d" " -f2-)

# 为排序后的符号分配编号并写入映射文件
for symbol in $sorted_symbols; do
    echo "$symbol $symbol_index" >> $map_file
    symbol_index=$((symbol_index+1))
done

# 使用patchelf处理所有elf文件
for elf in $elf_files; do
    patchelf --rename-dynamic-symbols $map_file $elf
done

# 删除临时文件
rm $temp_symbols

echo "Processing done!"
